/**
 * @file midi_protocol.h
 * @brief MIDI协议定义 (支持MIDI 1.0, MIDI 2.0 UMP, BLE MIDI)
 * @date 2025-11-04
 */

#ifndef __MIDI_PROTOCOL_H__
#define __MIDI_PROTOCOL_H__

#ifdef __cplusplus
extern "C" {
#endif

/* Includes ------------------------------------------------------------------*/
#include <stdint.h>
#include <stdbool.h>

/* MIDI 1.0 状态字节定义 ----------------------------------------------------*/

/* 状态字节类型 (高4位) */
#define MIDI_STATUS_NOTE_OFF        0x80    /* 音符关闭 8x */
#define MIDI_STATUS_NOTE_ON         0x90    /* 音符按下 9x */
#define MIDI_STATUS_CONTROL_CHANGE  0xB0    /* 控制变化 Bx */

/* 通道掩码 (低4位, 0x0-0xF) */
#define MIDI_CHANNEL_MASK           0x0F
#define MIDI_CHANNEL_MIN            0x00
#define MIDI_CHANNEL_MAX            0x0F

/* 数据范围 */
#define MIDI_DATA_MIN               0x00
#define MIDI_DATA_MAX               0x7F
#define MIDI_VELOCITY_MIN           0x00
#define MIDI_VELOCITY_MAX           0x7F

/* 控制变化(CC)命令定义 -----------------------------------------------------*/

#define MIDI_CC_SETUP_MODE          0x0E    /* 进入设置模式 B0 0E xx */
#define MIDI_CC_ALL_NOTES_OFF       0x7B    /* 全部音符关 B0 7B 00 */
#define MIDI_CC_TEMP_WARNING        0x0F    /* 温度警告 B0 0F 7F */

/* 设置模式子命令 */
#define MIDI_SETUP_TIME1            0x01    /* 调整时间1 (全功率启动时长) */
#define MIDI_SETUP_TIME2            0x02    /* 调整时间2 (力度打击时长) */
#define MIDI_SETUP_TIME3_1          0x03    /* 调整时间3-1 (第一悬停占空比) */
#define MIDI_SETUP_TIME3_2          0x04    /* 调整时间3-2 (第二悬停占空比) */
#define MIDI_SETUP_SAVE_EXIT        0x7F    /* 保存并退出设置模式 */

/* MIDI音符范围定义 ---------------------------------------------------------*/

/* 88键钢琴MIDI音符范围 (十六进制) */
#define MIDI_NOTE_MIN               0x15    /* 最低音 (板11, 键1) */
#define MIDI_NOTE_MAX               0x6C    /* 最高音 (板1, 键88) */

/* 板号定义 (B11-B1) */
#define BOARD_ID_MIN                1       /* 板号1 (对应B1, 琴键81-88) */
#define BOARD_ID_MAX                11      /* 板号11 (对应B11, 琴键1-8) */
#define BOARD_COUNT                 11      /* 总板数 */

/* 每块板控制的琴键数 */
#define KEYS_PER_BOARD              8

/* MIDI 2.0 UMP格式定义 -----------------------------------------------------*/

/* UMP消息类型 (32位对齐) */
typedef struct {
    uint32_t word1;     /* 第一个32位字 */
    uint32_t word2;     /* 第二个32位字 (可选) */
    uint32_t word3;     /* 第三个32位字 (可选) */
    uint32_t word4;     /* 第四个32位字 (可选) */
} midi_ump_packet_t;

/* UMP Message Type codes are defined in midi2_ump.h as enum */

/* MIDI 2.0分辨率常量 */
#define MIDI2_VELOCITY_MAX          65535   /* 16位velocity最大值 */
#define MIDI2_CONTROLLER_MAX        4294967295UL  /* 32位控制器最大值 */

/* BLE MIDI格式定义 ---------------------------------------------------------*/

/* BLE MIDI数据包头 */
#define BLE_MIDI_HEADER_MIN         0x80
#define BLE_MIDI_TIMESTAMP_MASK     0x1F

/* 消息类型枚举 -------------------------------------------------------------*/

typedef enum {
    MIDI_MSG_UNKNOWN = 0,       /* 未知消息 */
    MIDI_MSG_NOTE_ON,           /* 音符按下 */
    MIDI_MSG_NOTE_OFF,          /* 音符关闭 */
    MIDI_MSG_CONTROL_CHANGE,    /* 控制变化 */
    MIDI_MSG_ALL_NOTES_OFF,     /* 全部音符关闭 */
    MIDI_MSG_SETUP_MODE,        /* 进入设置模式 */
    MIDI_MSG_TEMP_WARNING       /* 温度警告 */
} midi_message_type_e;

#ifdef __cplusplus
}
#endif

#endif /* __MIDI_PROTOCOL_H__ */

/******************************** 文件结束 *********************************/
